package org.graduation.recruitment.controller.resume;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.graduation.recruitment.entity.pojo.resume.Resume;
import org.graduation.recruitment.entity.vo.ResumeVO;
import org.graduation.recruitment.service.resume.ResumeService;
import org.graduation.recruitment.utils.ResponseResult;
import org.graduation.recruitment.utils.Token;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/resume")
@Slf4j
@Tag(name = "学生简历接口", description = "提供学生简历相关的CRUD操作")
@SecurityRequirement(name = "openApiSecurityScheme")
public class ResumeController {

    // 注入简历服务
    @Autowired
    private ResumeService resumeService;
    // 注入token处理工具
    @Autowired
    private Token token;

    /**
     * 创建简历
     *
     * @param tokenStr 用户认证token
     * @param resume   要创建的简历信息
     * @return 创建成功返回成功信息，失败返回错误信息
     */
    @PostMapping("/create")
    @Operation(summary = "创建简历接口")
    public ResponseResult createResume(@RequestHeader("Authorization") String tokenStr, @RequestBody Resume resume) {
        resume.setStudentId(token.getUidByToken(tokenStr)); // 设置学生ID
        if (resumeService.save(resume)) { // 保存简历
            return ResponseResult.success();
        } else {
            return ResponseResult.fail("创建简历失败");
        }
    }

    /**
     * 更新简历
     *
     * @param resume   要更新的简历信息
     * @param tokenStr 用户认证token
     * @return 更新成功返回成功信息，失败返回错误信息
     */
    @PostMapping("/update")
    @Operation(summary = "更新简历接口")
    public ResponseResult updateResume(@RequestBody Resume resume, @RequestHeader("Authorization") String tokenStr) {
        Long uid = token.getUidByToken(tokenStr); // 获取用户ID
        if (!uid.equals(resume.getStudentId())) { // 检查是否更新他人简历
            return ResponseResult.fail("只能更新自己的简历");
        }
        if (resumeService.updateById(resume)) { // 更新简历
            return ResponseResult.success();
        } else {
            return ResponseResult.fail("更新简历失败");
        }
    }

    /**
     * 删除简历
     *
     * @param resume   要删除的简历信息
     * @param tokenStr 用户认证token
     * @return 删除成功返回成功信息，失败返回错误信息
     */
    @DeleteMapping("/delete")
    @Operation(summary = "删除简历接口")
    public ResponseResult deleteResume(@RequestBody Resume resume, @RequestHeader("Authorization") String tokenStr) {
        Long uid = token.getUidByToken(tokenStr); // 获取用户ID
        if (!uid.equals(resume.getStudentId())) { // 检查是否删除他人简历
            return ResponseResult.fail("只能删除自己的简历");
        }
        if (resumeService.removeById(resume.getId())) { // 删除简历
            return ResponseResult.success();
        } else {
            return ResponseResult.fail("删除简历失败");
        }
    }

    /**
     * 查看所有简历
     *
     * @return 返回所有简历列表
     */
    @GetMapping("/all")
    @Operation(summary = "查看所有简历接口")
    public ResponseResult getAllResume() {
        return ResponseResult.success(resumeService.list());
    }

    /**
     * 查看最新那个简历
     *
     * @param tokenStr 用户认证token
     * @return 返回最新的简历信息
     */
    @GetMapping("/one")
    @Operation(summary = "查看最新那个简历接口")
    public ResponseResult getOneResume(@RequestHeader("Authorization") String tokenStr) {
        Long uid = token.getUidByToken(tokenStr); // 获取用户ID
        Resume resume = resumeService.getOne(getOneResumeWrapper(uid)); // 获取最新简历
        return ResponseResult.success(resume);
    }

    /**
     * 查看resumeId对应的完整简历
     *
     * @param resumeId 简历ID
     * @param tokenStr 用户认证token
     * @return 返回指定简历ID的完整信息
     */
    @GetMapping("/resume_and_models")
    @Operation(summary = "查看resumeId对应的完整简历接口")
    public ResponseResult gerResumeAndAllResumeModels(@RequestParam Long resumeId, @RequestHeader("Authorization") String tokenStr) {
        ResumeVO resume = resumeService.getResumeAndAllResumeModels(resumeId); // 获取指定ID的简历和模型
        return ResponseResult.success(resume);
    }

    /**
     * 构造查询最新简历的查询包装器
     *
     * @param id 用户ID
     * @return 返回查询包装器
     */
    private LambdaQueryWrapper<Resume> getOneResumeWrapper(Long id) {
        return new LambdaQueryWrapper<Resume>()
                .eq(Resume::getStudentId, id) // 查询条件：学生ID匹配
                .orderByDesc(Resume::getId) // 排序条件：按ID降序
                .last("limit 1"); // 限制只返回一条记录
    }
}
